////1、浮点数的存储
// #include<stdio.h>
// int main()
// {
//     int number=6;
//     float* pFloat=(float*)&number;
//     printf("number=%d\n",number);//6
//     printf("*pFloat=%f\n",*pFloat);

//     *pFloat=6.0;
//     printf("number=%d\n",number);
//     printf("*pFloat=%f\n",*pFloat);//6.000000
//     return 0;
// }


// //2、字符使用
// #include<stdio.h>
// int main()
// {
//     char a=-1;
//     signed char b=-1;
//     unsigned char c=-1;
//     //用十进制输出
//     printf("a=%d\tb=%d\tc=%d\n",a,b,c);
//     return 0;
// } 


// //3、小端字节序存储
// //x86环境
// #include<stdio.h>
// int main()
// {
//     int arr[]={1,2,3,4};
//     int* ptr1=(int*)(&arr+1);
//     int* ptr2=(int*)((int)arr+1);
//     printf("%x   %x\n",ptr1[-1],*ptr2);
//     return 0;
// }


// //4、使用联合体判断大小端
// #include<stdio.h>
// int check_sys()
// {
//     union Un
//     {
//         char c;
//         int i;
//     }u;
//     u.i=1;
//     return u.c;
// }
// int main()
// {
//     int ret=check_sys();
//     if(ret)
//         printf("小端字节序存储\n");
//     else
//         printf("大端字节序存储\n");
//     return 0;
// }

// #include<stdio.h>
//  enum ENUM_A
// {
//   X1,
//   Y1,
//   Z1 = 255,
//   A1,
//   B1,
// };

// int main()
// { 
//     enum ENUM_A enumA = Y1;//1
//     enum ENUM_A enumB = B1;//257
//     printf("%d %d\n", enumA, enumB);
//     return 0;
// }


//5、使用malloc函数模拟开辟一个3*5的整型二维数组，开辟好后，使用二维数组的下标访问形式，访问空间。
// #include<stdio.h>
// #include<stdlib.h>
// int main()
// {

//     //二维数组思维
//     int* ptr=(int*)malloc(3*5*sizeof(int));
//     if(ptr==NULL)
//     {
//         perror("malloc");
//         return 1;
//     }
//     for(int i=0;i<3;i++)
//     {
//         for(int j=0;j<5;j++)
//         {
//             *(ptr+i*5+j)=i*j;
//         }
//     }
//     for(int i=0;i<3;i++)
//     {
//         for(int j=0;j<5;j++)
//         {
//             printf("%d ",ptr[i*4+j]);
//         }
//         printf("\n");
//     }
//     free(ptr);
//     ptr=NULL;

// printf("\n");
//     //数组指针
//     int (*ptr1)[5]=(int(*)[5])malloc(3*5*sizeof(int));
//     if(ptr1==NULL)
//     {
//         perror("malloc");
//         return 1;
//     }
//     for(int i=0;i<3;i++)
//     {
//         for(int j=0;j<5;j++)
//         {
//             ptr1[i][j]=i*j;
//             printf("%d ",ptr1[i][j]);
//         }
//         printf("\n");
//     }
//     free(ptr1);
//     ptr1=NULL;
//     printf("\n");

//     //指针数组
//     //首先申请一个指针数组
//     int** ptr2=(int**)malloc(3*sizeof(int*));//看作3个一维数组
//     for(int i=0;i<3;i++)
//     {
//         //开辟5个空间
//          ptr2[i]=(int*)malloc(5*sizeof(int));
//     }
//     //赋值
//     for(int i=0;i<3;i++)
//     {
//         for(int j=0;j<5;j++)
//         {
//             ptr2[i][j]=i*j;
//             printf("%d ",ptr2[i][j]);
//         }
//         printf("\n");
//     }
//     for(int i=0; i<3; i++)
//	    {
//	    	free(ptr2[i]);//记住要释放内存
//	    }
//	    free(ptr2);//释放两次，两次释放的不一样
//     return 0;
// }

//练习使用动态内存相关的4个函数，并调试观察。malloc、calloc、realloc、free

#include<stdio.h>
#include<stdlib.h>
int main()
{
    //malloc()从内存分配一块大小为size个字节的内存空间。空间是连续的可用空间，申请成功返回首地址
    //void* malloc(size_t size);
    int* ptr=(int*)malloc(5*sizeof(int));//开辟20个字节
    if(ptr==NULL)
    {
        perror("malloc");
        return 1;
    }
    //使用
    for(int i=0;i<5;i++)
    {
        *(ptr+i)=i+1;
    }
    for(int i=0;i<5;i++)
    {
        printf("%d ",*(ptr+i));
    }
    free(ptr);
    ptr=NULL;

printf("\n");
    
    //calloc()在malloc()的函数上多了一个功能就是初始化为0
    int* ptr1=(int*)calloc(5,5*sizeof(int));
    if(ptr1==NULL)
    {
        perror("calloc");
        return 1;
    }
    //使用
    for(int i=0;i<5;i++)
    {
        //*(ptr1+i)=i+1;
        printf("%d ",*(ptr1+i));
    }
    free(ptr1);
    ptr1=NULL;


    //void* realloc (void* ptr, size_t size);
    /*ptr 是要调整的内存地址
• size 调整之后新⼤⼩
• 返回值为调整之后的内存起始位置。
• 这个函数调整原内存空间⼤⼩的基础上，还会将原来内存中的数据移动到 新 的空间。
• realloc在调整内存空间的是存在两种情况：
◦ 情况1：原有空间之后有⾜够⼤的空间
◦ 情况2：原有空间之后没有⾜够⼤的空间
当是情况1 的时候，要扩展内存就直接原有内存之后直接追加空间，原来空间的数据不发⽣变化
当是情况2 的时候，原有空间之后没有⾜够多的空间时，扩展的⽅法是：在堆空间上另找⼀个合适⼤⼩
的连续空间来使⽤。这样函数返回的是⼀个新的内存地址。
*/
printf("\n");

    int* ptr2=(int*)malloc(5*sizeof(int));
    if(ptr2!=NULL)
    {
        for(int i=0;i<40;i++)
        {
            *(ptr2+i)=i+1;
            printf("%d ",*(ptr2+i));
        }
    }
    else{
        perror("malloc");
        return 1;
    }
    printf("\n");
    //调整空间
    // int* p=(int*)realloc(ptr2,20);
    // if(p!=NULL)
    // {
    //     ptr2=p;
    //     for(int i=0;i<20;i++)
    //     {
    //          *(ptr2+i)=i+1;
    //         printf("%d ",*(ptr2+i));
    //     }
    // }
    // else{
    //     perror("realloc");
    //     return 1;
    // }
    return 0;
}